﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
using System.Windows.Input;
using Autodesk.Revit.DB; // 需要引用 RevitAPI
using Autodesk.Revit.UI; // 需要引用 RevitAPIUI
using CategoryTest.ViewModel;

namespace CategoryTest.ViewModel
{
    public class MainWindowViewModel : BaseViewModel
    {
        // --- Revit 数据上下文 ---
        private readonly ExternalCommandData _commandData;
        private readonly UIDocument _uiDoc;
        private readonly Document _doc;

        // --- 左侧导航 ---
        private ObservableCollection<string> _dataTypes;
        public ObservableCollection<string> DataTypes
        {
            get => _dataTypes;
            set => SetProperty(ref _dataTypes, value);
        }

        private string _selectedDataType;
        public string SelectedDataType
        {
            get => _selectedDataType;
            set
            {
                if (SetProperty(ref _selectedDataType, value))
                {
                    // TODO: 当数据类型改变时，触发数据加载或过滤逻辑
                    LoadDataBasedOnType();
                }
            }
        }

        private ObservableCollection<TreeNodeModel> _projectStructure;
        public ObservableCollection<TreeNodeModel> ProjectStructure
        {
            get => _projectStructure;
            set => SetProperty(ref _projectStructure, value);
        }

        private TreeNodeModel _selectedNode;
        public TreeNodeModel SelectedNode
        {
            get => _selectedNode;
            set
            {
                if (SetProperty(ref _selectedNode, value))
                {
                    // TODO: 当树节点改变时，触发数据过滤逻辑
                    FilterDataBasedOnNode();
                }
            }
        }


        // --- 右侧数据展示 ---
        private string _filterText;
        public string FilterText
        {
            get => _filterText;
            set
            {
                if (SetProperty(ref _filterText, value))
                {
                    // TODO: 文本改变时，触发数据过滤逻辑 (可能需要防抖)
                    FilterDataBasedOnText();
                }
            }
        }

        // 使用一个基类或接口来容纳不同类型的数据项 (Room, Space, Area...)
        // 这里先用 object 占位，后面会定义具体类型
        private ObservableCollection<object> _displayedData;
        public ObservableCollection<object> DisplayedData
        {
            get => _displayedData;
            set => SetProperty(ref _displayedData, value);
        }

        // --- 分页 ---
        private int _currentPage = 1;
        public int CurrentPage
        {
            get => _currentPage;
            set => SetProperty(ref _currentPage, value); // TODO: 添加分页逻辑
        }

        private int _totalPages = 1;
        public int TotalPages
        {
            get => _totalPages;
            private set => SetProperty(ref _totalPages, value); // 通常是只读的
        }

        private int _pageSize = 10; // 每页显示数量
        public int PageSize
        {
            get => _pageSize;
            set => SetProperty(ref _pageSize, value); // TODO: 修改时需要重新分页
        }

        // --- 命令 ---
        public ICommand RefreshCommand { get; private set; }
        public ICommand ExportCommand { get; private set; }
        public ICommand GoToFirstPageCommand { get; private set; }
        public ICommand PreviousPageCommand { get; private set; }
        public ICommand NextPageCommand { get; private set; }
        public ICommand GoToLastPageCommand { get; private set; }


        // --- 构造函数 ---
        public MainWindowViewModel(ExternalCommandData commandData)
        {
            _commandData = commandData;
            _uiDoc = commandData.Application.ActiveUIDocument;
            _doc = _uiDoc.Document;

            // 初始化集合
            DataTypes = new ObservableCollection<string> { "房间 (Rooms)", "空间 (Spaces)", "面积分区 (Areas)", "分析空间", "分析表面" };
            ProjectStructure = new ObservableCollection<TreeNodeModel>();
            DisplayedData = new ObservableCollection<object>();

            // 初始化命令
            RefreshCommand = new RelayCommand(RefreshData);
            ExportCommand = new RelayCommand(ExportData, CanExportData); // TODO: 实现导出逻辑和条件
            // TODO: 初始化分页命令

            // 初始加载数据
            LoadInitialData();
        }


        // --- 私有方法 ---

        private void LoadInitialData()
        {
            // TODO: 加载初始的 TreeView 结构 (当前项目、链接等)
            LoadProjectStructure();
            // 默认选中第一个数据类型
            SelectedDataType = DataTypes.FirstOrDefault();
        }

        private void LoadProjectStructure()
        {
            ProjectStructure.Clear();
            // TODO: 使用 Revit API 获取项目和链接模型信息，构建树
            var rootNode = new TreeNodeModel { Header = $"当前项目 ({_doc.Title})", Tag = _doc }; // Tag 存放 Document 对象
            ProjectStructure.Add(rootNode);

            // 添加标高 (示例)
            FilteredElementCollector levelCollector = new FilteredElementCollector(_doc);
            var levels = levelCollector.OfClass(typeof(Level)).Cast<Level>().OrderBy(l => l.Elevation).ToList();
            foreach (var level in levels)
            {
                rootNode.Children.Add(new TreeNodeModel { Header = level.Name, Tag = level });
            }


            // 添加链接模型
            FilteredElementCollector linkCollector = new FilteredElementCollector(_doc);
            var linkInstances = linkCollector.OfClass(typeof(RevitLinkInstance)).Cast<RevitLinkInstance>().ToList();

            foreach (var linkInstance in linkInstances)
            {
                try
                {
                    Document linkDoc = linkInstance.GetLinkDocument();
                    string linkName = "链接模型 (未加载)";
                    if (linkDoc != null)
                    {
                        linkName = $"链接模型 ({linkDoc.Title})";
                    }
                    // Tag 可以存放 LinkInstance 本身或者 LinkDocument（如果已加载）
                    var linkNode = new TreeNodeModel { Header = linkName, Tag = linkInstance };
                    ProjectStructure.Add(linkNode);
                    // 可选：如果链接已加载，递归加载其内部结构（标高）
                    // if(linkDoc != null) { /* 加载链接文档的标高到 linkNode.Children */ }
                }
                catch (System.Exception ex)
                {
                    // 处理无法加载链接文档等异常
                    TaskDialog.Show("错误", $"处理链接 '{linkInstance.Name}' 时出错: {ex.Message}");
                    var errorNode = new TreeNodeModel { Header = $"链接模型 ({linkInstance.Name} - 加载错误)", Tag = linkInstance };
                    ProjectStructure.Add(errorNode);
                }

            }
        }


        private void LoadDataBasedOnType()
        {
            if (string.IsNullOrEmpty(SelectedDataType)) return;

            // TODO: 根据 SelectedDataType 调用 RevitDataService 获取相应类型的数据
            TaskDialog.Show("提示", $"将加载 {SelectedDataType} 数据...");
            // 伪代码：
            // var rawData = _revitDataService.GetData(_doc, SelectedDataType, SelectedNode); // 需要考虑过滤
            // ApplyFiltersAndPagination(rawData);
            DisplayedData.Clear(); // 临时清空
        }

        private void FilterDataBasedOnNode()
        {
            // TODO: 根据 SelectedNode 过滤数据
            TaskDialog.Show("提示", $"根据节点 '{SelectedNode?.Header}' 过滤数据...");
            // 重新应用过滤和分页
            // ApplyFiltersAndPagination(_allLoadedData); // 假设有一个包含所有数据的列表
        }


        private void FilterDataBasedOnText()
        {
            // TODO: 根据 FilterText 过滤数据
            // 考虑使用延迟执行或 Rx 来避免过于频繁的过滤
            System.Diagnostics.Debug.WriteLine($"根据文本 '{FilterText}' 过滤数据...");
            // 重新应用过滤和分页
            // ApplyFiltersAndPagination(_allLoadedData);
        }

        private void RefreshData()
        {
            TaskDialog.Show("刷新", "正在重新加载数据...");
            // TODO: 实现完整的刷新逻辑
            // 1. 重新加载 ProjectStructure
            LoadProjectStructure();
            // 2. 根据当前选择重新加载 DataGrid 数据
            LoadDataBasedOnType();
            // 3. (关键) 调用 Neo4jService 将最新数据同步到数据库
            // _neo4jService.SyncData(allExtractedData); // 需要先提取所有需要同步的数据
        }

        private void ExportData()
        {
            // TODO: 实现导出逻辑，例如导出 DisplayedData 到 CSV
            TaskDialog.Show("导出", "导出功能待实现。");
        }

        private bool CanExportData()
        {
            // TODO: 实现导出按钮是否可用的逻辑，例如，是否有数据可导出
            return DisplayedData.Any(); // 简单示例
        }

        // TODO: 实现分页命令的方法 (GoToFirstPage, PreviousPage, NextPage, GoToLastPage)
        // TODO: 实现核心的 ApplyFiltersAndPagination 方法来处理过滤和分页逻辑

    }
}

// --- 用于 TreeView 的模型 ---
public class TreeNodeModel : BaseViewModel // 继承 BaseViewModel 以支持 IsExpanded 等绑定
{
    private string _header;
    public string Header
    {
        get => _header;
        set => SetProperty(ref _header, value);
    }

    public object Tag { get; set; } // 存储关联的 Revit 对象 (Document, Level, RevitLinkInstance 等)

    private ObservableCollection<TreeNodeModel> _children = new ObservableCollection<TreeNodeModel>();
    public ObservableCollection<TreeNodeModel> Children
    {
        get => _children;
        set => SetProperty(ref _children, value);
    }

    private bool _isExpanded;
    public bool IsExpanded
    {
        get => _isExpanded;
        set => SetProperty(ref _isExpanded, value);
    }

    private bool _isSelected;
    public bool IsSelected
    {
        get => _isSelected;
        set => SetProperty(ref _isSelected, value); // 通常在 TreeView 中设置，通知 ViewModel
    }
}
